前言:
程式碼(program code)儲存在硬碟(Hard Disk Memory),當啟動執行檔執行命令的時候,執行檔在隨機存取記憶體(RAM)形成一個進程(process),當 CPU 需要時,呼叫各個命令(instruction)完成指令。進程(process)是指一個正在執行的程式,當程式要求被執行時,就會被載入到記憶體中,形成一個進程。在進程中,包括了程式碼、資料和堆疊等。
在一個系統中,RAM的大小是有限的,而program code的大小是不限的。當process的大小超過RAM的大小時,或是多個process同時需要被執行,就會出現系統會因為無法分配更多的 RAM 而無法執行程式
因為記憶體碎片化(Memory Fragmentation)導致沒有完整的區段可以執行指令,這樣 CPU 在執行指令時,就會因為找不到足夠的記憶體而停止執行。
為了解決記憶體碎片化的問題,現在的系統都會做記憶體虛擬化(Memory Virtualization),也就是給每一個進程(Process)一個完整的虛擬記憶體(Virtual Memory),需要載下來時再對應到實體記憶體(Physical Memory)。
Virtual Memory 可以將碎片化的區塊結合成完整的一片給進程(Process)使用,讓每一個進程(Process)在執行時都以為得到的是一整塊完整的記憶體區塊,但實際上可能是碎片化的。
此外,Virtual Memory 的實現需要使用硬碟記憶體(Hard Disk Memory)作為暫存的地方。
Demand Paging 策略中,程式執行之初不將全部的 pages 載入 memory,而是僅載入執行所需的 pages。如要處理 page fault 問題,由作業系統另行處理。例如,整個系統被載入 Virtual Memory,但需要執行某個 function 時,這個 function 才會從 Virtual Memory 載入到 Physical Memory。
在 Copy-on-Write 策略中,如果有多個呼叫者同時要求相同資源(如記憶體或磁碟上的資料儲存),則他們會共同取得相同的指標指向相同的資源,直到某個呼叫者試圖修改資源的內容時,系統才會真正複製一份專用副本(private copy)給該呼叫者,而其他呼叫者所見到的最初的資源仍然保持不變。因為沒有修改就不會產生副本,所以多用來讀多寫少的開發場景。
Page Replacement Algorithm 是一種分頁處理的演算法,用於處理 Virtual Memory 中 page 的選擇和置換。若Memory內沒有frame可以用時,可以跑可以找一個暫時不用的page,將其清除,供目前需求page使用。
常見的 Page Replacement Algorithm 包括:FIFO(First In First Out)、OPT(Optimal Algorithm)、LRU(Least Recently Used)、LFU(Least Frequently Used)等。
當要替換一頁page時,系統就去選擇記憶體內最久的一個page,也就是最早被載入記憶體的page,將它換成需求的page。可透過FIFO queue來掌握記憶體內的所有分頁。
一共發生12次page fault
但是可能會Belady’s Anomaly問題
將長期沒用到的page換成需求page,把未來長時間不會用到的page替換掉。(首先要有預知未來的技術)
把最近不常使用的page替換掉,用過去推測未來。但需要特殊的硬體支援,很少系統能完整的實作。
最不經常使用的 (least frequently used, LFU)演算法讓次數最少的那一頁被替換掉。